﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace IPlayer
{
    /// <summary>
    /// 解码回调委托
    /// </summary>
    /// <param name="buffer">数据缓冲区的指针</param>
    /// <param name="width">帧图像的宽度</param>
    /// <param name="height">帧图像的高度度</param>
    public delegate void DecodeCallback(IntPtr buffer, int width, int height);
    /// <summary>
    /// 将视频流绘在指定窗口的委托
    /// </summary>
    /// <param name="G">画笔</param>
    public delegate void PaintCallback(Graphics G);
    /// <summary>
    /// 打开视频文件时的状态类型
    /// </summary>
    public enum OpenStateEnum
    {
        /// <summary>
        /// 其他类型
        /// </summary>
        Other,
        /// <summary>
        /// 关闭视频
        /// </summary>
        Close,
        /// <summary>
        /// 文件流播放类型
        /// </summary>
        FilePlay,
        /// <summary>
        /// 文件流解码类型
        /// </summary>
        FileDecode,
        /// <summary>
        /// 实时流解码类型
        /// </summary>
        RealDecode
    }
    /// <summary>
    /// 播放视频文件时的状态类型
    /// </summary>
    public enum PlayStateEnum
    {
        /// <summary>
        /// 其他类型
        /// </summary>
        Other,
        /// <summary>
        /// 停止
        /// </summary>
        Stop,
        /// <summary>
        /// 播放，包括快放、慢放、正常播放，可从暂停，停止，单帧状态转移
        /// </summary>
        Play,
        /// <summary>
        /// 暂停，可从播放状态转移，播放速度保留
        /// </summary>
        Pause,
        /// <summary>
        /// 单帧播放，包括单帧进、单帧退，可从播放状态转移，但播放速度变为0
        /// </summary>
        Single,
    }

    /// <summary>
    /// 录像SDK接口，为各种平台的SDK提供了统一的接口
    /// </summary>
    public interface IPlayerSDK
    {
        /// <summary>
        ///  设置将视频流绘在指定窗口的委托
        /// </summary>
        PaintCallback PaintCallback { set; }
        /// <summary>
        /// 设置解码回调委托
        /// </summary>
        DecodeCallback DecodeCallback { set; }

        /// <summary>
        /// 获取显示录像窗体句柄和消息接收窗体句柄
        /// </summary>
        IntPtr Handle { get; }

        /// <summary>
        /// 获取打开视频文件时的状态类型
        /// </summary>
        OpenStateEnum OpenState { get; }

        /// <summary>
        /// 获取播放视频文件时的状态类型
        /// </summary>
        PlayStateEnum PlayState { get; }

        /// <summary>
        /// 获取帧图像的宽度
        /// </summary>
        int Width { get; }

        /// <summary>
        /// 获取帧图像的高度
        /// </summary>
        int Height { get; }

        /// <summary>
        /// 播放速度
        ///     大于0表示快放，小于0表示慢放，等于0表示正常播放
        ///     取值范围：[-4,4]
        /// </summary>
        int PlaySpeed { get; }

        /// <summary>
        /// 打开录像文件
        /// </summary>
        /// <param name="file">将要播放的文件名</param>
        /// <param name="handle">显示录像窗体句柄和消息接收窗体句柄</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool Open(string file, IntPtr handle);

        /// <summary>
        /// 开启录像文件流解码
        /// </summary>
        /// <param name="file">将要打开文件的文件名</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool Open(string file);

        /// <summary>
        /// 开启实时流解码
        /// </summary>
        /// <param name="buffer">缓冲区指针</param>
        /// <param name="bufferSize">缓冲区的大小</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool Open(IntPtr buffer, uint bufferSize);

        /// <summary>
        /// 关闭实时流
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool Close();

        ///// <summary>
        ///// 关闭播放文件
        ///// </summary>
        ///// <returns>true表示成功，false表示失败</returns>
        //bool Close();

        /// <summary>
        /// 播放
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool Play();

        /// <summary>
        /// 停止播放
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool Stop();

        /// <summary>
        /// 暂停播放
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool Pause();

        /// <summary>
        /// 恢复播放
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool Continue();

        /// <summary>
        /// 快速播放，每次调用将使当前播放速度加快一倍，最多调用4次
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool Fast();

        /// <summary>
        /// 慢速播放，每次调用将使当前播放速度慢一倍；最多调用4次
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool Slow();

        /// <summary>
        /// 单帧播放
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool OneByOne();

        /// <summary>
        /// 单帧回放
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool OneByOneBack();

        /// <summary>
        /// 获取文件总的时间长度，单位：秒
        /// </summary>
        /// <returns>返回文件总的时间长度</returns>
        uint GetFileTime();

        /// <summary>
        /// 获取总帧数
        /// </summary>
        /// <returns>返回文件总帧数</returns>
        uint GetTotalFrames();

        /// <summary>
        /// 获取当前码流中编码时的帧率
        /// </summary>
        /// <returns>返回当前码流中编码时的帧率</returns>
        uint GetFrameRate();

        /// <summary>
        /// 设置播放指针相对位置，范围0-100%
        /// </summary>
        /// <param name="position">播放指针相对位置，范围0-100%</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool SetPlayPos(float position);

        /// <summary>
        /// 根据时间设置文件播放位置，单位：毫秒
        /// </summary>
        /// <param name="time">将要设置的时间位置</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool SetPlayedTime(uint time);

        /// <summary>
        /// 设置当前播放播放位置到指定帧号；此函数必须在文件索引生成之后才能调用。
        /// </summary>
        /// <param name="number">指定帧号</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool SetFrameNumber(uint number);

        /// <summary>
        /// 获取播放指针相对位置，范围0-100%
        /// </summary>
        /// <returns>返回播放指针相对位置</returns>
        float GetPlayPos();

        /// <summary>
        /// 获取当前播放时间，单位：毫秒
        /// </summary>
        /// <returns>返回当前播放时间</returns>
        uint GetPlayedTime();

        /// <summary>
        /// 得到当前帧序号
        /// </summary>
        /// <returns>返回当前的帧序号</returns>
        uint GetFrameNumber();


    }
}
